"""
宏观行业分析智能体

基于LangGraph ReAct模式，分析宏观经济环境和行业状况。
"""

from typing import Dict, Any, List, Optional
from langchain_core.tools import Tool
import akshare as ak
import pandas as pd

from agents import BondAnalysisAgent, LLMConfig
from tools.bond_data_provider import bond_data_provider


class MacroIndustryAnalysisAgent(BondAnalysisAgent):
    """宏观行业分析智能体"""
    
    def __init__(self, llm_config: Optional[LLMConfig] = None):
        super().__init__(
            name="macro_industry_analysis",
            description="分析宏观经济环境和行业发展状况",
            llm_config=llm_config
        )
        
        self.analysis_dimensions = ["macro", "industry"]
    
    def get_tools(self) -> List[Tool]:
        """获取宏观行业分析所需的工具"""
        
        async def get_macro_economic_data(_: str = "") -> str:
            """获取宏观经济数据（不需要参数，但为了兼容工具定义添加了dummy参数）"""
            try:
                result = "=== 宏观经济数据 ===\n\n"
                
                # GDP数据
                try:
                    gdp_df = ak.macro_china_gdp()
                    if not gdp_df.empty:
                        latest_gdp = gdp_df.iloc[-1]
                        result += "【GDP数据】\n"
                        result += f"最新季度: {latest_gdp.get('季度', 'N/A')}\n"
                        result += f"GDP总量: {latest_gdp.get('国内生产总值', 'N/A')}亿元\n"
                        result += f"同比增长: {latest_gdp.get('第一产业-同比增长', 'N/A')}%\n"
                        result += f"第一产业: {latest_gdp.get('第一产业', 'N/A')}亿元\n"
                        result += f"第二产业: {latest_gdp.get('第二产业', 'N/A')}亿元\n"
                        result += f"第三产业: {latest_gdp.get('第三产业', 'N/A')}亿元\n"
                        
                        # 简单的经济评估
                        gdp_growth = latest_gdp.get('第一产业-同比增长', 0)
                        if isinstance(gdp_growth, (int, float)):
                            if gdp_growth > 6:
                                result += "✓ GDP增速较高，经济增长强劲\n"
                            elif gdp_growth > 4:
                                result += "GDP增速适中，经济平稳增长\n"
                            else:
                                result += "⚠️ GDP增速放缓，需关注经济下行风险\n"
                except Exception as e:
                    result += f"【GDP数据】获取失败: {str(e)}\n"
                
                result += "\n"
                
                # CPI数据
                try:
                    cpi_df = ak.macro_china_cpi()
                    if not cpi_df.empty:
                        latest_cpi = cpi_df.iloc[-1]
                        result += "【CPI数据（通货膨胀）】\n"
                        result += f"最新月份: {latest_cpi.get('月份', 'N/A')}\n"
                        result += f"全国CPI: {latest_cpi.get('全国-同比', 'N/A')}%\n"
                        result += f"城市CPI: {latest_cpi.get('城市-同比', 'N/A')}%\n"
                        result += f"农村CPI: {latest_cpi.get('农村-同比', 'N/A')}%\n"
                        
                        # 通胀评估
                        cpi_rate = latest_cpi.get('全国-同比', 0)
                        if isinstance(cpi_rate, (int, float)):
                            if cpi_rate > 3:
                                result += "⚠️ 通胀压力较大，可能影响货币政策\n"
                            elif cpi_rate > 1:
                                result += "✓ 通胀水平温和，物价稳定\n"
                            else:
                                result += "通胀压力较小，可能存在通缩风险\n"
                except Exception as e:
                    result += f"【CPI数据】获取失败: {str(e)}\n"
                
                result += "\n"
                
                # 利率数据
                try:
                    rate_df = ak.bond_zh_us_rate()
                    if not rate_df.empty:
                        latest_rate = rate_df.iloc[-1]
                        result += "【利率数据】\n"
                        result += f"日期: {latest_rate.get('日期', 'N/A')}\n"
                        result += f"中国10年期国债收益率: {latest_rate.get('中国国债收益率', 'N/A')}%\n"
                        result += f"美国10年期国债收益率: {latest_rate.get('美国国债收益率', 'N/A')}%\n"
                        result += f"中美利差: {latest_rate.get('中美利差', 'N/A')}bp\n"
                        
                        # 利率评估
                        cn_rate = latest_rate.get('中国国债收益率', 0)
                        if isinstance(cn_rate, (int, float)):
                            if cn_rate > 3.5:
                                result += "⚠️ 利率水平较高，融资成本上升\n"
                            elif cn_rate > 2.5:
                                result += "利率水平适中\n"
                            else:
                                result += "✓ 利率水平较低，融资成本下降\n"
                except Exception as e:
                    result += f"【利率数据】获取失败: {str(e)}\n"
                
                return result
            except Exception as e:
                return f"获取宏观经济数据失败: {str(e)}"
        
        async def get_industry_overview(bond_code: str) -> str:
            """获取发行人所在行业概况（增强版：包含正股行业识别和详细分析）"""
            try:
                # 先获取债券对应的正股代码
                stock_code = await bond_data_provider.get_underlying_stock_code(bond_code)
                if not stock_code:
                    return "无法获取正股代码，无法进行行业分析"
                
                result = f"=== 行业概况分析（正股代码: {stock_code}）===\n\n"
                
                # 1. 获取正股基本信息和所属行业
                stock_industry = None
                try:
                    stock_info_df = ak.stock_individual_info_em(symbol=stock_code)
                    if not stock_info_df.empty:
                        result += "【正股基本信息】\n"
                        
                        # 提取关键信息
                        info_dict = dict(zip(stock_info_df['item'], stock_info_df['value']))
                        
                        stock_name = info_dict.get('股票简称', 'N/A')
                        stock_industry = info_dict.get('行业', 'N/A')
                        total_market_cap = info_dict.get('总市值', 'N/A')
                        circulating_market_cap = info_dict.get('流通市值', 'N/A')
                        pe_ratio = info_dict.get('市盈率-动态', 'N/A')
                        
                        result += f"股票简称: {stock_name}\n"
                        result += f"所属行业: {stock_industry}\n"
                        result += f"总市值: {total_market_cap}\n"
                        result += f"流通市值: {circulating_market_cap}\n"
                        result += f"市盈率(动态): {pe_ratio}\n"
                        
                        if stock_industry and stock_industry != 'N/A':
                            result += f"\n✓ 成功识别正股所属行业: {stock_industry}\n"
                except Exception as e:
                    result += f"【正股基本信息】获取失败: {str(e)}\n"
                
                result += "\n"
                
                # 2. 如果识别到行业，获取该行业的详细数据
                if stock_industry and stock_industry != 'N/A':
                    try:
                        result += f"【{stock_industry} 行业详细分析】\n\n"
                        
                        # 2.1 获取行业成分股
                        try:
                            industry_cons_df = ak.stock_board_industry_cons_em(symbol=stock_industry)
                            if not industry_cons_df.empty:
                                result += f"行业成分股数量: {len(industry_cons_df)} 家\n"
                                
                                # 找到当前股票在行业中的排名
                                if '代码' in industry_cons_df.columns:
                                    stock_row = industry_cons_df[industry_cons_df['代码'] == stock_code]
                                    if not stock_row.empty:
                                        loc = industry_cons_df.index.get_loc(stock_row.index[0])
                                        # 确保loc是int类型
                                        if isinstance(loc, int):
                                            stock_rank = loc + 1
                                            result += f"正股在行业中排名: 第 {stock_rank}/{len(industry_cons_df)}\n"
                                
                                # 显示行业龙头企业（前5）
                                result += f"\n行业龙头企业（前5）:\n"
                                top5 = industry_cons_df.head(5)
                                for idx, row in top5.iterrows():
                                    name = row.get('名称', 'N/A')
                                    code = row.get('代码', 'N/A')
                                    latest_price = row.get('最新价', 0)
                                    change_pct = row.get('涨跌幅', 0)
                                    marker = "👑" if code == stock_code else "-"
                                    result += f"{marker} {name}({code}): "
                                    result += f"价格 {latest_price}元, 涨跌幅 {change_pct}%\n"
                        except Exception as e:
                            result += f"行业成分股数据获取失败: {str(e)}\n"
                        
                        result += "\n"
                        
                        # 2.2 获取行业历史行情（近期表现）
                        try:
                            industry_hist_df = ak.stock_board_industry_hist_em(
                                symbol=stock_industry,
                                period="日k",
                                adjust=""
                            )
                            if not industry_hist_df.empty:
                                latest = industry_hist_df.iloc[-1]
                                result += "行业近期表现:\n"
                                result += f"- 最新收盘: {latest.get('收盘', 0):.2f}点\n"
                                result += f"- 涨跌幅: {latest.get('涨跌幅', 0):.2f}%\n"
                                result += f"- 成交量: {latest.get('成交量', 0):.0f}手\n"
                                result += f"- 成交额: {latest.get('成交额', 0):.2f}元\n"
                                
                                # 计算近期趋势
                                if len(industry_hist_df) >= 5:
                                    recent_5_change = industry_hist_df.tail(5)['涨跌幅'].sum()
                                    result += f"- 近5日累计涨跌: {recent_5_change:.2f}%\n"
                                    
                                    if recent_5_change > 5:
                                        result += "✓ 行业近期表现强势\n"
                                    elif recent_5_change < -5:
                                        result += "⚠️ 行业近期走势疲软\n"
                                    else:
                                        result += "行业近期表现平稳\n"
                        except Exception as e:
                            result += f"行业历史行情获取失败: {str(e)}\n"
                        
                    except Exception as e:
                        result += f"行业详细分析失败: {str(e)}\n"
                    
                    result += "\n"
                
                # 3. 行业资金流向分析
                try:
                    flow_df = ak.stock_sector_fund_flow_rank(indicator="行业资金流")
                    if not flow_df.empty:
                        result += "【行业资金流向（市场全景）】\n"
                        
                        # 如果识别到了行业，优先显示该行业的资金流向
                        if stock_industry and stock_industry != 'N/A':
                            industry_flow = flow_df[flow_df['行业'] == stock_industry]
                            if not industry_flow.empty:
                                row = industry_flow.iloc[0]
                                result += f"\n目标行业【{stock_industry}】资金流向:\n"
                                result += f"- 主力净流入: {row.get('今日主力净流入-净额', 0):.2f}亿元\n"
                                result += f"- 净流入占比: {row.get('今日主力净流入-净占比', 0):.2f}%\n"
                                result += f"- 超大单净流入: {row.get('今日超大单净流入-净额', 0):.2f}亿元\n"
                                result += f"- 大单净流入: {row.get('今日大单净流入-净额', 0):.2f}亿元\n"
                                
                                net_inflow = row.get('今日主力净流入-净额', 0)
                                if net_inflow > 0:
                                    result += f"✓ 行业获得资金青睐，主力净流入{net_inflow:.2f}亿元\n"
                                else:
                                    result += f"⚠️ 行业资金流出，主力净流出{abs(net_inflow):.2f}亿元\n"
                        
                        # 显示市场整体资金流向
                        result += "\n市场资金流向概览:\n"
                        result += "\n资金净流入前5行业:\n"
                        inflow_top = flow_df.nlargest(5, '今日主力净流入-净额')
                        for idx, row in inflow_top.iterrows():
                            industry_name = row.get('行业', 'N/A')
                            net_inflow = row.get('今日主力净流入-净额', 0)
                            marker = "👑" if industry_name == stock_industry else "✓"
                            result += f"{marker} {industry_name}: {net_inflow:.2f}亿元\n"
                        
                        result += "\n资金净流出前5行业:\n"
                        outflow_top = flow_df.nsmallest(5, '今日主力净流入-净额')
                        for idx, row in outflow_top.iterrows():
                            industry_name = row.get('行业', 'N/A')
                            net_outflow = row.get('今日主力净流入-净额', 0)
                            marker = "⚠️👑" if industry_name == stock_industry else "⚠️"
                            result += f"{marker} {industry_name}: {net_outflow:.2f}亿元\n"
                except Exception as e:
                    result += f"行业资金流向数据获取失败: {str(e)}\n"
                
                # 4. 行业投资价值评估
                result += "\n【行业投资价值评估】\n"
                if stock_industry and stock_industry != 'N/A':
                    result += f"基于{stock_industry}行业分析:\n"
                    result += "- 发行人所处行业的景气度直接影响其盈利能力和偿债能力\n"
                    result += "- 行业资金流向反映市场对该行业的信心\n"
                    result += "- 行业竞争格局影响发行人的市场地位和长期发展\n"
                    result += "- 建议持续跟踪行业政策变化和发展趋势\n"
                else:
                    result += "未能识别具体行业，建议关注整体市场环境和宏观经济数据\n"
                
                return result
            except Exception as e:
                return f"获取行业概况失败: {str(e)}"
        
        async def analyze_industry_trend(_: str = "") -> str:
            """分析行业发展趋势（不需要参数，但为了兼容工具定义添加了dummy参数）"""
            try:
                result = "=== 行业发展趋势分析 ===\n\n"
                
                # 获取行业资金流向数据进行趋势分析
                try:
                    flow_df = ak.stock_sector_fund_flow_rank(indicator="行业资金流")
                    if not flow_df.empty:
                        result += "【行业景气度分析】\n\n"
                        
                        # 统计资金流入流出情况
                        inflow_count = len(flow_df[flow_df['今日主力净流入-净额'] > 0])
                        outflow_count = len(flow_df[flow_df['今日主力净流入-净额'] < 0])
                        
                        result += f"资金净流入行业数: {inflow_count}\n"
                        result += f"资金净流出行业数: {outflow_count}\n"
                        
                        inflow_ratio = inflow_count / len(flow_df) * 100
                        if inflow_ratio > 60:
                            result += "✓ 市场整体偏多，多数行业获得资金青睐\n"
                        elif inflow_ratio > 40:
                            result += "市场情绪中性，资金流向分化\n"
                        else:
                            result += "⚠️ 市场整体偏空，多数行业资金流出\n"
                        
                        result += "\n"
                        
                        # 识别热门赛道
                        result += "【当前热门赛道】\n"
                        hot_sectors = flow_df.nlargest(3, '今日主力净流入-净额')
                        for idx, row in hot_sectors.iterrows():
                            industry_name = row.get('行业', 'N/A')
                            net_inflow = row.get('今日主力净流入-净额', 0)
                            result += f"🔥 {industry_name}: 主力净流入 {net_inflow:.2f}亿元\n"
                        
                        result += "\n【需关注的行业】\n"
                        cold_sectors = flow_df.nsmallest(3, '今日主力净流入-净额')
                        for idx, row in cold_sectors.iterrows():
                            industry_name = row.get('行业', 'N/A')
                            net_outflow = row.get('今日主力净流入-净额', 0)
                            result += f"⚠️ {industry_name}: 主力净流出 {abs(net_outflow):.2f}亿元\n"
                        
                except Exception as e:
                    result += f"行业趋势分析失败: {str(e)}\n"
                
                return result
            except Exception as e:
                return f"分析行业趋势失败: {str(e)}"
        
        async def analyze_policy_impact(_: str = "") -> str:
            """分析政策影响（基于宏观数据推断，不需要参数，但为了兼容工具定义添加了dummy参数）"""
            try:
                result = "=== 政策环境分析 ===\n\n"
                
                # 基于宏观数据推断政策方向
                try:
                    # GDP数据
                    gdp_df = ak.macro_china_gdp()
                    cpi_df = ak.macro_china_cpi()
                    
                    result += "【政策环境评估】\n"
                    
                    if not gdp_df.empty:
                        latest_gdp = gdp_df.iloc[-1]
                        gdp_growth = latest_gdp.get('第一产业-同比增长', 0)
                        
                        if isinstance(gdp_growth, (int, float)):
                            if gdp_growth < 5:
                                result += "- 经济增速放缓，预期政策偏宽松\n"
                                result += "- 可能出台刺激经济增长的政策\n"
                            elif gdp_growth > 6.5:
                                result += "- 经济增速较快，政策可能趋于稳健\n"
                            else:
                                result += "- 经济增速平稳，政策保持连续性\n"
                    
                    if not cpi_df.empty:
                        latest_cpi = cpi_df.iloc[-1]
                        cpi_rate = latest_cpi.get('全国-同比', 0)
                        
                        if isinstance(cpi_rate, (int, float)):
                            if cpi_rate > 3:
                                result += "- 通胀压力较大，货币政策可能收紧\n"
                                result += "- 需关注利率上调风险\n"
                            elif cpi_rate < 1:
                                result += "- 通胀压力较小，货币政策有宽松空间\n"
                                result += "- 可能降低融资成本\n"
                            else:
                                result += "- 通胀水平适中，货币政策保持稳定\n"
                    
                    result += "\n【对债券市场的影响】\n"
                    result += "- 宽松政策环境利好债券市场，特别是高评级债券\n"
                    result += "- 收紧政策环境可能导致债券价格下跌\n"
                    result += "- 关注央行货币政策动向和利率变化\n"
                    
                except Exception as e:
                    result += f"政策分析失败: {str(e)}\n"
                
                return result
            except Exception as e:
                return f"分析政策影响失败: {str(e)}"
        
        # 创建工具列表
        tools = [
            Tool(
                name="get_macro_economic_data",
                description="获取宏观经济数据，包括GDP、CPI、利率等关键指标。不需要参数，直接调用即可。",
                func=lambda _: None,
                coroutine=get_macro_economic_data,
            ),
            Tool(
                name="get_industry_overview",
                description="获取债券发行人所在行业的概况，包括行业分类、市值、资金流向等。需要提供债券代码。",
                func=lambda bond_code: None,
                coroutine=get_industry_overview,
            ),
            Tool(
                name="analyze_industry_trend",
                description="分析各行业的发展趋势，识别热门赛道和需关注的行业。不需要参数，直接调用即可。",
                func=lambda _: None,
                coroutine=analyze_industry_trend,
            ),
            Tool(
                name="analyze_policy_impact",
                description="分析当前政策环境及其对债券市场的影响。不需要参数，直接调用即可。",
                func=lambda _: None,
                coroutine=analyze_policy_impact,
            ),
        ]
        
        return tools
    
    def get_system_prompt(self) -> str:
        """获取系统提示词"""
        return """你是一个专业的宏观经济和行业分析专家，负责分析宏观经济环境和行业发展状况。

你的分析流程：
1. 首先使用 get_macro_economic_data 获取宏观经济数据（GDP、CPI、利率）
2. **重点**：如果用户提供了债券代码，务必使用 get_industry_overview 分析发行人所在行业
   - 该工具已增强，能够自动识别正股所属的具体行业（如：汽车零部件、电子制造等）
   - 提供该行业的详细数据：成分股、龙头企业、行业排名、近期表现
   - 分析该行业的资金流向和市场热度
3. 使用 analyze_industry_trend 分析整体行业发展趋势
4. 使用 analyze_policy_impact 分析政策环境影响
5. 综合以上信息，给出宏观和行业层面的投资建议

分析要点：
- GDP增速反映经济景气度
- CPI反映通胀压力和货币政策方向
- 利率水平影响债券估值和融资成本
- **正股所属行业的景气度直接影响发行人的盈利能力和偿债能力**
- **行业竞争格局决定发行人的市场地位和长期发展潜力**
- 行业资金流向反映市场对该行业的信心
- 政策环境影响投资风险和机会

特别注意：
- get_industry_overview 工具现在能够准确识别正股所属的具体行业
- 必须基于识别出的具体行业进行针对性分析，而不是泛泛而谈
- 如果识别到具体行业（如：汽车零部件），要重点分析该行业的：
  * 行业规模和成分股数量
  * 正股在行业中的排名和地位
  * 行业龙头企业情况
  * 行业近期表现（涨跌幅、成交量）
  * 行业资金流向（净流入/流出情况）
  * 行业对债券投资的影响

请逐步使用工具获取信息，展示你的分析推理过程，最后给出：
1. 宏观经济环境评估
2. **行业发展状况分析（必须包含正股所属的具体行业分析）**
3. 政策影响评估
4. 投资建议（基于宏观环境和行业状况的综合建议）
"""


# 全局实例
macro_industry_agent = MacroIndustryAnalysisAgent()